---
id: lab5-intro
slug: /labs/lab5
sidebar_position: 1
---

# 5. Сортировка одномерного числового массива

Алиас: `сортировка`.

## Цель работы

- освоение методов обработки массивов на примере сортировки массива;
- знакомство с алгоритмами сортировки;
- использование динамических массивов;
- инициализация массивов с помощью датчика случайных чисел;
- оценка быстродействия алгоритма.

## Задание

Отсортировать числовой массив методами:

- метод сортировки выбором;
- методом пузырькового всплытия.

По окончании сортировки вывести:

- отсортированный массив;
- количество сделанных сравнений;
- перестановок элементов.

Сравнить быстродействие алгоритмов, которое определяется числом сравнений и перестановок, для исходного неотсортированного массива и для исходного массива, отсортированного в прямом и обратном порядке.

Исследовать зависимость быстродействия от размера массива. Возможность изменения длины массива реализуйте с помощью динамического массива, а для его инициализации используйте датчик случайных чисел. Результаты исследования выведите в виде таблицы (без рамок).

**Ширина столбца**: 16 символов.

:::caution

Последний столбец пробелами не заполняется!

:::

## Пример вывода в консоли

В начале выводится результат работы для случайно сгенерированного динамического массива. Количество элементов в массиве: `5`. Сортировка осуществляется `по возрастанию` и `по убыванию`. Сравнение быстродействия алгоритмов:

- сначала сортировка применяется к неотсортированному массиву (`<название метода> (n)`);
- затем сортировка применяется к отсортированному массиву  (`<название метода> (o)`).

:::info

Алгоритмы сортировки массивов различаются по быстродействию и занимаемой памяти, причем эти характеристики зависят от упорядоченности сортируемого массива.

:::

Затем генерируются массивы с количеством элементов `5`, `50`, `500`. Сгенерированные массивы не выводить в консоль. Методы необходимо сравнивать на одинаковых массивах. Осуществлять сортировку по возрастанию на неотсортированном массиве.

```bash
Количество элементов: 5. Заданный массив: 10 1 2 3 4. Сортировка по возрастанию
Метод           Результат       Сравнений       Перестановок  
сравнений (n)   1 2 3 4 10      7               4
сравнений (о)   1 2 3 4 10      4               0
пузырек (n)     1 2 3 4 10      10              4
пузырек (о)     1 2 3 4 10      10              0

Количество элементов: 5. Заданный массив: 10 1 2 3 4. Сортировка по убыванию
Метод           Результат       Сравнений       Перестановок  
сравнений (n)   10 4 3 2 1      10              10
сравнений (о)   10 4 3 2 1      10              0
пузырек (n)     10 4 3 2 1      10              2
пузырек (о)     10 4 3 2 1      4               0

Метод: сравнений (n). Сортировка по возрастанию
N               Сравнений       Перестановок  
5               10              2
50              1225            43
500             124750          451

Метод: пузырек (n). Сортировка по возрастанию
N               Сравнений       Перестановок  
5               10              10
50              1159            586
500             43344           30914
```

## Указания по выполнению работы

:::danger

Методы сортировки оформить в виде функций. В случае игнорирования данного требования, код будет отправлен на доработку.

:::

При выполнении работы обратите внимание на следующие требования и рекомендации:

1. Необходимо использовать динамический массив.
2. Обнуления динамической памяти при ее выделении не происходит (см. какие конструкции для выделения памяти используются).
3. Автоматический контроль выхода индекса за границы массива не производится, поэтому программист должен следить за этим самостоятельно.
4. Перед выходом локального указателя из области его действия следует освобождать связанную с ним динамическую память.
   1. Для C освобождение памяти, выделенной посредством `malloc`, выполняется с помощью функции `free`.
   2. Для C++ Освобождение памяти, выделенной посредством `new[]`, выполняется с помощью операции `delete[]`.

## Проверка задания

Подготовленная программа для решения задания проверяется вручную преподавателем (визуальный контроль).

## Методический материал

1. [Требования к отчету](RequirementsForReport.md)
2. Генератор случайного числа в диапазоне:
   1. [Для программ на C](Randomizer/ForC.md)
   2. [Для программ на C++](Randomizer/ForCpp.md)
3. Динамические массивы:
   1. [Для программ на C](DynamicArrays/ForC.md)
   2. [Для программ на C++](DynamicArrays/ForCpp.md)
4. Методы сортировки:
   1. [Сортировка выбором](Sorting/Selection.md)
   2. [Пузырьковая сортировка](Sorting/Bubble.md)
5. Полезная информация:
   1. [Для всех](UsefulInformation/ForAll.md)
   2. [Для программ на C](UsefulInformation/ForC.md)
   3. [Для программ на C++](UsefulInformation/ForCpp.md)
6. Контрольные вопросы:
   1. [Для потока на С](TestQuestion/ForC.md)
   2. [Для потока на С++](TestQuestion/ForCpp.md)
